#ifndef _BINARY_SEARCH_TREE_H_
#define _BINARY_SEARCH_TREE_H_

#include <stdbool.h>

#define STRLEN 20
#define MAXITEMS 20

typedef struct item
{
    char petName[STRLEN];
    char petkind[STRLEN];
} Item;

typedef struct treeNode
{
    Item item;
    struct treeNode *leftnode;
    struct treeNode *rightnode;
} TreeNode;

typedef struct tree
{
    TreeNode *root;
    unsigned int size;
} Tree;

/**
 * @brief 初始化树结构
 *
 * @param ptree
 */
void InitializeTree(Tree *ptree);

/**
 * @brief 判断树是否为空
 *
 * @param ptree
 * @return true 成功
 * @return false 失败
 */
bool TreeIsEmpty(const Tree *ptree);

/**
 * @brief 判断树是否为满
 *
 * @param ptree
 * @return true 成功
 * @return false 失败
 */
bool TreeIsFull(const Tree *ptree);

/**
 * @brief 返回树中的项数
 *
 * @param ptree
 * @return unsigned int
 */
unsigned int TreeItemCount(const Tree *ptree);

/**
 * @brief 向树中添加项
 *
 * @param pitem 待添加的项
 * @param ptree
 * @return true 成功
 * @return false 失败
 */
bool AddItemToTree(const Item *pitem, Tree *ptree);

/**
 * @brief 从树中删除项
 *
 * @param pitem 待删除项
 * @param ptree
 * @return true 成功
 * @return false 失败
 */
bool DeleteItemFromTree(const Item *pitem, Tree *ptree);

/**
 * @brief 从树中查找对应的项
 *
 * @param pitem
 * @param ptree
 * @return true 查找到项
 * @return false 没有此项
 */
bool FindItemFromTree(const Item *pitem, Tree *ptree);

/**
 * @brief 为每一个树中的元素执行一次传入的函数
 *
 * @param ptree 传入的树
 * @param pFunction 待执行的每一个函数
 */
void TreeTraverse(const Tree *ptree, void (*pFunction)(Item pitem));

/**
 * @brief 清除树中的所有元素
 *
 * @param tree
 */
void DropTree(Tree *tree);

#endif